Nakama Authenticate
cockroach DB にユーザー情報が格納される
すべてのユーザーが登録されており
オンライン要素に必要なプロファイル(Record)持つ
グループを見つける
チャット
Fetch Account
code: .sh
TOKEN="eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1aWQiOiJhZjI1MDU3MC1kOTk5LTQxNmQtYjI1Yy1hZTFlY2JhMTMwMDEiLCJ1c24iOiJHV1JYa2NXU29pIiwiZXhwIjoxNjAyMjIwNTM5fQ.NnF2yUgcByg97fFnke6WJ5B_N0U3Kk2VbFuh9J0uJ8I"
echo $TOKEN
curl -X GET 'http://localhost:7350/v2/account' \
-H "authorization: Bearer $TOKEN"
User
userテーブルに追加されていく
code: .yml
# public fields
user.
id: string
username: string
display_name: string
avatar_url: https://****.png
lang: en, jp, ...
location: ""
timezone: ""
metadata: JSONB, (client は read-only, serverは read-write)
edge_count: int, フレンドの数
- edge = 辺、線
# Social系
facebook_id: string
google_id: string
gamecenter_id: string
steam_id: string
# その他
crate_time: timestamp
update_time: string
online:
# private fields
email: string
devices: string array (ユーザーがログインに使ったことのあるデバイスのIDリスト)
custom_id: ユーザーに紐づくカスタムID
wallet: JSONB, 通貨(user からは read-only)
verify_time: timestamp (ユーザーが有効化された時間。FaceBookにしか使われてない)
Cockroach DB への接続
Install
code: .sh
brew install cockroachdb/tap/cockroach
cockroachコマンドのサブコマンドにsqlがある
それで接続する。
code: .sh
cockroach sql --insecure --host=localhost:26257
select * from user;
\q
Postgres 互換
タブ補完に対応してない。??を入力してtabを押すとなんか出る
\ の見た目が Oに変換される (終了時のコマンドは Oq)
動作は変わらない
Nakamaが使うDBは、nakamaという名前のDBにある。
nakama.****でアクセス
code: .sh
select * from nakama.users;
User metadata
あるユーザーの、他のユーザーに対して公開したいメタデータ
script runtimeからのみ操作できる (lua, go モジュール)
1user / 16KB まで
usersテーブルのカラムにない情報はすべて表現できる
チート対策でいじれないパラメータを保存するのに最適
Virtual wallet
仮想通貨
トランザクション台帳 (transaction ledger)
script runtimeでのみ操作可能
サーバーサイドコードのみ (lua, go)
code: .lua
local nk = require("nakama")
local user_id = "95f05d94-cc66-445a-b4d1-9e262662cf79"
local content = {
reward_coins = 1000 -- Add 1000 coins to the user's wallet.
}
local status, err = pcall(nk.wallet_update, user_id, content)
if (not status) then
nk.logger_error(("User wallet update error: %q"):format(err))
end
JSONB型なので、
Lua: table
Go: map
で操作して保存すると、DB上でも更新される。
現金
ゲーム内通貨
ポイント
チケット
などなど、小分けにして保存もできる
Online indicator
ユーザーがオンラインかどうかを見る。
2つの方法
Fetch user
{url}/v2/user?ids=...のような感じでリクエストを送って取得する
スタンダードな方法 (curl でもデバッグできる)
サーバーサイドコードの場合は、複数人のuserを取得できる
PubSub
https://heroiclabs.com/docs/social-status/
socket.send の中身で status_follow/unfollow を送って subscrive / unsubscrive する
相手にstatusの更新を送るには status_updateを送る
code: .js
var status = await socket.send({ status_follow: { user_ids: "<user id>" } });
status.presences.forEach((presence) => {
console.log("User %o has status %o", presence.user_id, presence.status);
});
Update Account
PUTで更新
{url}/v2/accountに送る
/account/{id}になってないのは、
authorization: Bearer <token>で送るトークンで user.id を識別するから
サーバーサイドの rpc を使うと、自分のじゃないアカウント情報も更新できたりする
(セキュリティ的によろしくなさそう)